```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MyBatis 核心机制解析</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            line-height: 1.8;
            color: #333;
            background-color: #f9fafb;
        }
        .hero {
            background: linear-gradient(135deg, #6b46c1 0%, #805ad5 100%);
        }
        .code-block {
            background-color: #2d3748;
            border-left: 4px solid #805ad5;
        }
        .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
        }
        .section-title {
            position: relative;
            padding-bottom: 10px;
        }
        .section-title:after {
            content: '';
            position: absolute;
            bottom: 0;
            left: 0;
            width: 50px;
            height: 3px;
            background: linear-gradient(90deg, #805ad5, #d53f8c);
        }
        .first-letter {
            font-size: 3.5em;
            float: left;
            line-height: 0.8;
            margin-right: 8px;
            color: #805ad5;
            font-weight: bold;
        }
    </style>
</head>
<body class="antialiased">
    <!-- Hero Section -->
    <section class="hero text-white py-20 px-4 md:px-0">
        <div class="container mx-auto max-w-5xl text-center">
            <h1 class="text-4xl md:text-5xl font-bold mb-6 font-serif">MyBatis 核心机制解析</h1>
            <p class="text-xl md:text-2xl mb-8 max-w-3xl mx-auto">深入剖析 SQL 执行流程与组件协作原理</p>
            <div class="flex justify-center space-x-4">
                <a href="#overview" class="px-6 py-3 bg-white text-purple-700 rounded-lg font-medium hover:bg-opacity-90 transition-all">开始探索</a>
                <a href="#mermaid-chart" class="px-6 py-3 bg-transparent border-2 border-white rounded-lg font-medium hover:bg-white hover:bg-opacity-20 transition-all">工作原理图</a>
            </div>
        </div>
    </section>

    <!-- Overview Section -->
    <section id="overview" class="py-16 px-4 md:px-0">
        <div class="container mx-auto max-w-5xl">
            <div class="mb-12">
                <h2 class="text-3xl font-bold mb-6 section-title">核心组件概览</h2>
                <p class="text-gray-600 text-lg">
                    <span class="first-letter">M</span>yBatis 是一个优秀的持久层框架，它封装了 JDBC 的复杂操作，提供了便捷的数据库访问方式。本文将深入分析 MyBatis 的核心工作机制，包括 SqlSession 的创建与使用、SQL 执行流程、参数绑定与结果集处理等关键环节。通过了解这些内部机制，开发者可以更高效地使用 MyBatis，并能够在遇到问题时快速定位和解决。
                </p>
            </div>

            <div class="grid md:grid-cols-2 gap-8 mb-12">
                <div class="bg-white rounded-xl shadow-md p-6 transition-all duration-300 card">
                    <div class="text-purple-600 mb-4">
                        <i class="fas fa-cogs text-3xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-3">核心组件</h3>
                    <p class="text-gray-600">
                        MyBatis 的核心组件包括 SqlSession、Executor、StatementHandler、ParameterHandler 和 ResultSetHandler 等，它们协同工作完成 SQL 执行的全过程。
                    </p>
                </div>
                <div class="bg-white rounded-xl shadow-md p-6 transition-all duration-300 card">
                    <div class="text-purple-600 mb-4">
                        <i class="fas fa-project-diagram text-3xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-3">执行流程</h3>
                    <p class="text-gray-600">
                        MyBatis 的执行流程遵循清晰的路径：从 SQL 解析、参数绑定到 SQL 执行，最后处理结果集并返回。每个环节都由专门的组件负责处理。
                    </p>
                </div>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <section class="py-8 px-4 md:px-0 bg-white">
        <div class="container mx-auto max-w-5xl">
            <!-- Section 1 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">1. SqlSession 初始化与获取</h2>
                <p class="mb-6 text-gray-700">
                    在 MyBatis 中，<code class="bg-gray-100 px-2 py-1 rounded">SqlSession</code> 是执行 SQL 操作的核心对象。它由 <code class="bg-gray-100 px-2 py-1 rounded">SqlSessionFactory</code> 创建，通过 <code class="bg-gray-100 px-2 py-1 rounded">openSession()</code> 方法获取。
                </p>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">SqlSessionFactory</code> 使用配置文件加载配置数据，通过 <code class="bg-gray-100 px-2 py-1 rounded">build()</code> 方法初始化 <code class="bg-gray-100 px-2 py-1 rounded">SqlSessionFactory</code>，进而创建 <code class="bg-gray-100 px-2 py-1 rounded">SqlSession</code>。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>// SqlSessionFactoryBuilder 构建 SqlSessionFactory
public SqlSessionFactory build(InputStream inputStream) {
    // 使用 Configuration 解析 XML 配置
    Configuration configuration = new Configuration();
    XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder(inputStream);
    configuration = xmlConfigBuilder.parse();
    // 创建 SqlSessionFactory
    return new DefaultSqlSessionFactory(configuration);
}</code></pre>
                </div>
                <div class="bg-blue-50 border-l-4 border-blue-400 p-4 rounded-r">
                    <div class="flex">
                        <div class="flex-shrink-0 text-blue-400">
                            <i class="fas fa-info-circle"></i>
                        </div>
                        <div class="ml-3">
                            <p class="text-sm text-blue-700">
                                在实际应用中，通常使用 <code class="bg-blue-100 px-1 py-0.5 rounded">SqlSessionFactoryBuilder</code> 从 XML 配置文件或 Java 配置类构建 <code class="bg-blue-100 px-1 py-0.5 rounded">SqlSessionFactory</code>，然后通过工厂对象创建 <code class="bg-blue-100 px-1 py-0.5 rounded">SqlSession</code> 执行数据库操作。
                            </p>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Section 2 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">2. SqlSession 中的 select 方法</h2>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">SqlSession</code> 是 MyBatis 中用来执行 SQL 的主要接口。每次调用 <code class="bg-gray-100 px-2 py-1 rounded">selectOne()</code> 或 <code class="bg-gray-100 px-2 py-1 rounded">selectList()</code> 时，实际调用的是 <code class="bg-gray-100 px-2 py-1 rounded">SqlSession</code> 中的 <code class="bg-gray-100 px-2 py-1 rounded">select</code> 方法。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>public &lt;E&gt; List&lt;E&gt; selectList(String statement, Object parameter) {
    // 获取 SqlSessionFactory
    Executor executor = this.configuration.newExecutor(this, ExecutorType.SIMPLE);
    // 执行 SQL 查询
    return executor.query(statement, parameter);
}</code></pre>
                </div>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">selectList()</code> 方法会调用 <code class="bg-gray-100 px-2 py-1 rounded">Executor</code> 的 <code class="bg-gray-100 px-2 py-1 rounded">query()</code> 方法，<code class="bg-gray-100 px-2 py-1 rounded">Executor</code> 接口是负责执行具体 SQL 操作的核心。
                </p>
            </div>

            <!-- Section 3 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">3. Executor 接口与 query() 方法</h2>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">Executor</code> 是 MyBatis 中的执行器，它定义了执行 SQL 的操作。常见的 <code class="bg-gray-100 px-2 py-1 rounded">Executor</code> 实现有 <code class="bg-gray-100 px-2 py-1 rounded">SimpleExecutor</code>, <code class="bg-gray-100 px-2 py-1 rounded">ReuseExecutor</code> 和 <code class="bg-gray-100 px-2 py-1 rounded">BatchExecutor</code>。<code class="bg-gray-100 px-2 py-1 rounded">SimpleExecutor</code> 是最常见的一种。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>public List&lt;Object&gt; query(String statement, Object parameter) throws SQLException {
    // 通过 StatementHandler 创建 Statement 对象
    StatementHandler handler = configuration.newStatementHandler();
    Statement stmt = handler.prepare(connection, transaction);
    // 通过 ResultSetHandler 处理结果集
    ResultSetHandler resultSetHandler = configuration.newResultSetHandler();
    return resultSetHandler.handleResultSets(stmt);
}</code></pre>
                </div>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">Executor</code> 通过 <code class="bg-gray-100 px-2 py-1 rounded">StatementHandler</code> 和 <code class="bg-gray-100 px-2 py-1 rounded">ResultSetHandler</code> 处理 SQL 语句的准备、执行及结果映射。
                </p>
            </div>

            <!-- Section 4 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">4. StatementHandler 的工作原理</h2>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">StatementHandler</code> 负责 SQL 的准备工作，如创建 <code class="bg-gray-100 px-2 py-1 rounded">PreparedStatement</code>、设置参数等。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>public Statement prepare(Connection connection, Transaction transaction) throws SQLException {
    // 创建 PreparedStatement，设置 SQL 语句
    Statement statement = connection.prepareStatement(sql);
    setParameters(statement);
    return statement;
}</code></pre>
                </div>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">StatementHandler</code> 的 <code class="bg-gray-100 px-2 py-1 rounded">prepare()</code> 方法负责执行 SQL 语句的预编译，并为查询设置参数。
                </p>
            </div>

            <!-- Section 5 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">5. ParameterHandler 的作用</h2>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">ParameterHandler</code> 是 MyBatis 用来处理 SQL 语句参数的组件，它负责将 Java 对象中的参数绑定到 SQL 语句中。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>public void setParameters(PreparedStatement ps) throws SQLException {
    // 根据参数的类型设置 PreparedStatement 参数
    ps.setString(1, parameter.getName());
}</code></pre>
                </div>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">setParameters()</code> 方法根据 SQL 语句中参数的顺序，通过 <code class="bg-gray-100 px-2 py-1 rounded">PreparedStatement</code> 将 Java 参数绑定到 SQL 中。
                </p>
            </div>

            <!-- Section 6 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">6. ResultSetHandler 的工作原理</h2>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">ResultSetHandler</code> 负责处理 SQL 执行后的结果集，将 <code class="bg-gray-100 px-2 py-1 rounded">ResultSet</code> 中的数据映射到 Java 对象中。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>public List&lt;Object&gt; handleResultSets(Statement stmt) throws SQLException {
    ResultSet resultSet = stmt.getResultSet();
    List&lt;Object&gt; results = new ArrayList&lt;&gt;();
    while (resultSet.next()) {
        Object result = getResult(resultSet);
        results.add(result);
    }
    return results;
}</code></pre>
                </div>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">ResultSetHandler</code> 会将每一行数据从 <code class="bg-gray-100 px-2 py-1 rounded">ResultSet</code> 中提取出来，并映射为目标对象。
                </p>
            </div>

            <!-- Section 7 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">7. MappedStatement 的配置与 SQL 映射</h2>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">MappedStatement</code> 是 MyBatis 中用于封装 SQL 语句和映射信息的对象，它包含了执行 SQL 语句的详细信息。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>MappedStatement ms = configuration.getMappedStatement(statement);
String sql = ms.getSql();</code></pre>
                </div>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">MappedStatement</code> 中保存了 SQL 语句、查询参数类型、结果类型等信息，并由 <code class="bg-gray-100 px-2 py-1 rounded">SqlSession</code> 传递给 <code class="bg-gray-100 px-2 py-1 rounded">Executor</code> 执行。
                </p>
            </div>

            <!-- Section 8 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">8. 事务管理与 Transaction 接口</h2>
                <p class="mb-6 text-gray-700">
                    MyBatis 使用 <code class="bg-gray-100 px-2 py-1 rounded">Transaction</code> 接口来管理事务。<code class="bg-gray-100 px-2 py-1 rounded">Transaction</code> 负责开启、提交和回滚事务。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>public void commit() throws SQLException {
    // 提交事务
    this.connection.commit();
}
public void rollback() throws SQLException {
    // 回滚事务
    this.connection.rollback();
}</code></pre>
                </div>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">Transaction</code> 接口的实现由数据库连接来控制，MyBatis 会根据配置使用不同的事务管理方式。
                </p>
            </div>

            <!-- Section 9 -->
            <div class="mb-16">
                <h2 class="text-2xl font-bold mb-6 section-title">9. 自动生成 SQL 和参数绑定的流程</h2>
                <p class="mb-6 text-gray-700">
                    MyBatis 支持动态 SQL 语句的生成，例如通过 <code class="bg-gray-100 px-2 py-1 rounded">&lt;if&gt;</code>, <code class="bg-gray-100 px-2 py-1 rounded">&lt;choose&gt;</code> 等标签生成不同的 SQL 语句。在执行时，<code class="bg-gray-100 px-2 py-1 rounded">SqlSession</code> 会根据 <code class="bg-gray-100 px-2 py-1 rounded">MappedStatement</code> 的配置，动态构建 SQL。
                </p>
                <div class="code-block rounded-lg overflow-hidden mb-6">
                    <pre class="text-gray-200 p-4 overflow-x-auto"><code>public String getSql() {
    // 根据条件动态拼接 SQL 语句
    if (condition) {
        return "SELECT * FROM table WHERE id = ?";
    }
    return "SELECT * FROM table";
}</code></pre>
                </div>
                <p class="mb-6 text-gray-700">
                    <code class="bg-gray-100 px-2 py-1 rounded">ParameterHandler</code> 会在执行 SQL 时，根据用户输入的参数生成最终的 SQL 语句。
                </p>
            </div>
        </div>
    </section>

    <!-- Mermaid Diagram -->
    <section id="mermaid-chart" class="py-16 px-4 md:px-0 bg-gray-50">
        <div class="container mx-auto max-w-5xl">
            <h2 class="text-3xl font-bold mb-12 text-center">MyBatis 核心执行流程</h2>
            <div class="bg-white p-8 rounded-xl shadow-md">
                <div class="mermaid">
                    graph TD
                        A[SqlSession] -->|调用select方法| B(Executor)
                        B -->|创建| C[StatementHandler]
                        C -->|创建| D[PreparedStatement]
                        C -->|使用| E[ParameterHandler]
                        B -->|使用| F[ResultSetHandler]
                        D -->|执行SQL| G[数据库]
                        G -->|返回结果| F
                        F -->|返回映射结果| B
                        B -->|返回结果| A
                        H[MappedStatement] -->|提供SQL配置| B
                        I[Transaction] -->|管理事务| B
                </div>
            </div>
        </div>
    </section>

    <!-- Summary Section -->
    <section class="py-16 px-4 md:px-0">
        <div class="container mx-auto max-w-5xl">
            <div class="bg-gradient-to-r from-purple-50 to-blue-50 rounded-xl p-8 shadow-inner">
                <h2 class="text-2xl font-bold mb-6 text-purple-800">关键要点总结</h2>
                <ul class="space-y-4">
                    <li class="flex items-start">
                        <span class="flex-shrink-0 h-6 w-6 flex items-center justify-center rounded-full bg-purple-100 text-purple-600">
                            <i class="fas fa-check"></i>
                        </span>
                        <span class="ml-3 text-gray-700">SqlSession 是 MyBatis 的核心接口，通过 SqlSessionFactory 创建</span>
                    </li>
                    <li class="flex items-start">
                        <span class="flex-shrink-0 h-6 w-6 flex items-center justify-center rounded-full bg-purple-100 text-purple-600">
                            <i class="fas fa-check"></i>
                        </span>
                        <span class="ml-3 text-gray-700">Executor 负责实际的 SQL 执行，有 SimpleExecutor、ReuseExecutor 和 BatchExecutor 三种实现</span>
                    </li>
                    <li class="flex items-start">
                        <span class="flex-shrink-0 h-6 w-6 flex items-center justify-center rounded-full bg-purple-100 text-purple-600">
                            <i class="fas fa-check"></i>
                        </span>
                        <span class="ml-3 text-gray-700">StatementHandler 处理 SQL 语句的准备，ParameterHandler 处理参数绑定</span>
                    </li>
                    <li class="flex items-start">
                        <span class="flex-shrink-0 h-6 w-6 flex items-center justify-center rounded-full bg-purple-100 text-purple-600">
                            <i class="fas fa-check"></i>
                        </span>
                        <span class="ml-3 text-gray-700">ResultSetHandler 负责将数据库结果集映射为 Java 对象</span>
                    </li>
                    <li class="flex items-start">
                        <span class="flex-shrink-0 h-6 w-6 flex items-center justify-center rounded-full bg-purple-100 text-purple-600">
                            <i class="fas fa-check"></i>
                        </span>
                        <span class="ml-3 text-gray-700">MappedStatement 封装了 SQL 语句的配置信息</span>
                    </li>
                    <li class="flex items-start">
                        <span class="flex-shrink-0 h-6 w-6 flex items-center justify-center rounded-full bg-purple-100 text-purple-600">
                            <i class="fas fa-check"></i>
                        </span>
                        <span class="ml-3 text-gray-700">Transaction 接口提供了事务管理的能力</span>
                    </li>
                </ul>
            </div>
        </div>
    </section>

    <!-- Footer -->
    <footer class="bg-gray-900 text-white py-12 px-4">
        <div class="container mx-auto max-w-5xl">
            <div class="flex flex-col md:flex-row justify-between items-center">
                <div class="mb-4 md:mb-0">
                    <h3 class="text-xl font-bold mb-2">技术小馆</h3>
                    <p class="text-gray-400">深入技术细节，探索实现原理</p>
                </div>
                <div>
                    <a href="http://www.yuque.com/jtostring" class="text-purple-300 hover:text-white transition-colors">
                        <i class="fas fa-external-link-alt mr-2"></i> http://www.yuque.com/jtostring
                    </a>
                </div>
            </div>
            <div class="border-t border-gray-800 mt-8 pt-8 text-center text-gray-500 text-sm">
                &copy; 2023 技术小馆. 保留所有权利.
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
    </script>
</body>
</html>
```